#ifndef _FSPRITE_H
#define _FSPRITE_H
#include "Personnage.h"

#define SGN(X) (((X)==0)?(0):(((X)<0)?(-1):(1)))
#define ABS(X) ((((X)<0)?(-(X)):(X)))

typedef struct sTerrain Terrain;
typedef struct sPersonnage Personnage;

/**
@struct Sprite Sprite.h "~/lif7-projet-jetpack/src/Sprite.h" Structure définissant un Sprite. \n
*/

struct Ssprite
{
	Terrain* pTer;
	Personnage* pPer;
};
typedef struct Ssprite Sprite;

/**
@brief <B> Brief Description </B> Initialise un sprite. \n
@details <B> Description </B> Alloue de la mémoire dans le tas,et initialise le sprite sp avec x,y,w,h et m. \n
@param[in] Map Pointeur sur m. \n
@param[in] entiers Les coordonnées x,y,w et h. \n
@return Retourne un Sprite. \n
*/
Sprite* InitialiserSprite(Sprite * pSprite, int x,int y,int w,int h,Terrain* pTer);

/**
@brief <B> Brief Description </B> Libere la mémoire allouée.\n
@details <B> Description </B> Libère la mémoire allouée dans le tas et retourne 0. \n
@param[in] Sprite Pointeur sur un Sprite \n
@return Retourne 0. \n
*/
int LibereSprite(Sprite*);

/**
@brief <B> Brief Description </B> Test la collision. \n
@details <B> Description </B> Test si le personnage ne sort pas du monde.Test si la boite englobante ne rencontre pas un obstacle. \n
@param[in] Sprite Pointeur sur perso. \n
@return Retourne un entier. \n
*/
int CollisionDecors(Sprite* perso);

/**
@brief <B> Brief Description </B> Test si un déplacement est possible. \n
@param[in] Sprite Pointeur sur perso. \n
@param[in] entiers Les vecteurs vx et vy. \n
@return Retourne un entier. \n
*/
int EssaiDeplacement(Sprite* perso,int vx,int vy);

/**
@brief <B> Brief Description </B> Affine la collision.\n
@details <B> Description </B> Permet d'avoir une meilleur précision pour gérer la collision. \n
@param[in] Sprite Pointeur sur perso \n
@param[in] entiers Les vecteurs vx et vy. \n
*/
void Affine(Sprite* perso,int vx,int vy);


/**
@brief <B> Brief Description </B> Test si les déplacements sont possibles. \n
@details <B> Description </B> Test si les vecteurs vx et vy sont pas trop grands et lance récursivement la fonction DeplaceSprite jusqu'à obtenir la bonne taille.Teste ensuite si le déplacement est possible avec EssaieDeplacement.Enfin,lance Affine pour affiner la collision.\n
@param[in] Map Pointeur sur m. \n
@param[in] entiers Les coordonnées x,y,w et h. \n
@return Retourne un entier. \n
*/
int DeplaceSprite(Sprite* perso,int vx,int vy);

/**
@brief <B> Brief Description </B> Test si le personnage est mort(fin de partie). \n
@param[in,out] Sprite Pointeur sur perso. \n
@param[in] Entier Vecteur vy et vyS. \n
@return Retourne un entier. \n
*/
int persMort(Sprite * perso,int vx, int vy);

/**
@brief <B> Brief Description </B> Met à jour le scrolling. \n
@details <B> Description </B> Permet de mettre à jour le scrolling sur le personnage. \n
@param[in,out] Sprite Pointeur sur pSprite. \n
@param[in,out] Terrain Pointeur sur pTer. \n
@return Retourne un entier. \n
*/
int UpdateScroll(Terrain* pTer, Sprite * pSprite);

#endif
